[...slug].vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <div>
  3. <SldHomeTopSearch />
  4. <NavCatHeader />
  5. <div class="self_background">
  6. <div class="sld_store_list">
  7. <img class="store_list_banner" :src="banneIMG" />
  8. <div class="seller_list_search clearfix">
  9. <input
  10. type="text"
  11. name="sellerName"
  12. :placeholder="L['请输入店铺名称']"
  13. v-model="keyWords"
  14. @keyup.enter="search_store(keyWords)"
  15. />
  16. <button @click="search_store(keyWords)">{{ L["搜索"] }}</button>
  17. </div>
  18. <div class="seller_list">
  19. <div class="fav_list fav_list_box clearfix">
  20. <template v-for="(item, index) in initData.data" :key="index">
  21. <StoreItem :item="item" :ItemIndex="index" :skeleton="firstLoading">
  22. </StoreItem>
  23. </template>
  24. </div>
  25. </div>
  26. </div>
  27. <!-- 分页 start -->
  28. <div class="flex_row_center_center sld_pagination">
  29. <el-pagination
  30. @current-change="handleCurrentChange"
  31. v-model:currentPage="pageData.current"
  32. :page-size="pageData.pageSize"
  33. layout="prev, pager, next"
  34. :total="pageData.total"
  35. :hide-on-single-page="true"
  36. >
  37. </el-pagination>
  38. </div>
  39. <!-- 分页 end -->
  40. </div>
  41. <!-- 空页面 start-->
  42. <SldCommonEmpty v-if="!firstLoading && !initData.data.length" />
  43. <!-- 空页面 end-->
  44. </div>
  45. </template>
  46. <script setup>
  47. import { getCurrentInstance, onMounted, reactive, ref } from "vue";
  48. import { ElPagination } from "element-plus";
  49. import { getCurLanguage } from '@/composables/common.js';
  50. const route = useRoute();
  51. const router = useRouter();
  52. // const L = lang_zn;
  53. const L = getCurLanguage();
  54. const firstLoading = ref(true); //是否第一次加载
  55. const initData = reactive({ data: [] });
  56. const pageData = reactive({
  57. current: 1,
  58. pageSize: 8,
  59. total: null,
  60. });
  61. const keyWords = ref("");
  62. const routeParams = reactive({ data: {} });
  63. const params = reactive({
  64. current: route.params.page,
  65. pageSize: pageData.pageSize,
  66. });
  67. const clacRouteParams = () => {
  68. let arr = route.params.slug;
  69. let newArr = {};
  70. for (let i in arr) {
  71. newArr[arr[i].toString().split("-")[0]] = arr[i].toString().split("-")[1];
  72. }
  73. routeParams.data = newArr;
  74. if (routeParams.data.current) {
  75. params.current = routeParams.data.current;
  76. }
  77. if (routeParams.data.keyword) {
  78. params.keyword = routeParams.data.keyword;
  79. keyWords.value = routeParams.data.keyword;
  80. }
  81. getInitData(params);
  82. };
  83. useHead({
  84. title: "Store List",
  85. });
  86. //获取banner图
  87. const banneIMG = ref('')
  88. const getBannerData = async () => {
  89. const { data: res } = await useFetch(
  90. apiUrl +
  91. "v3/system/front/setting/getSettings?names=default_image_store_list_top"
  92. );
  93. if (res._rawValue.state == 200) {
  94. banneIMG.value = res._rawValue.data[0] == null ? '/store_list_banner.png' : res._rawValue.data[0]
  95. }
  96. };
  97. getBannerData();
  98. //初始化数据
  99. const getInitData = async (params) => {
  100. let searchParams = { ...params };
  101. let keys = "";
  102. if (searchParams.keyword) {
  103. keys += searchParams.keyword;
  104. }
  105. if (searchParams.current) {
  106. keys += searchParams.current;
  107. }
  108. const { data: value, pending: pending } = await useFetch(
  109. apiUrl + "v3/seller/front/store/list",
  110. { params: params, key: keys.toString() }
  111. );
  112. const res = value._rawValue;
  113. if (!pending._rawValue) {
  114. firstLoading.value = false;
  115. }
  116. if (res.state === 200) {
  117. initData.data = res.data.list;
  118. pageData.current = res.data.pagination.current;
  119. pageData.pageSize = res.data.pagination.pageSize;
  120. pageData.total = res.data.pagination.total;
  121. }
  122. };
  123. //分页切换
  124. const handleCurrentChange = (e) => {
  125. params.current = e;
  126. router.push({
  127. path: "/store/list/current-" + e,
  128. });
  129. };
  130. //店铺搜索
  131. const search_store = (keyWord) => {
  132. if (keyWord == "") {
  133. router.push({
  134. path: "/store/list/current-1",
  135. });
  136. } else {
  137. router.push({
  138. path: "/store/list/current-1/keyword-" + keyWord,
  139. });
  140. }
  141. keyWords.value = routeParams.data.keyWord;
  142. params.keyword = keyWord;
  143. getInitData(params);
  144. };
  145. onMounted(() => {
  146. nextTick(() => {
  147. clacRouteParams();
  148. });
  149. });
  150. </script>
  151. <style lang="scss" scoped>
  152. @import "@/assets/style/storeList.scss";
  153. @import "@/assets/style/base.scss";
  154. .sld_pagination {
  155. width: 580px;
  156. margin: 0 auto;
  157. padding: 30px 0;
  158. }
  159. </style>